#include "AMXX_Helpers.h"
#include <assert.h>

t_SubscribeEvent_Helper::t_SubscribeEvent_Helper(AMX *amx, const char *event_name):
	m_AMX(amx), m_EventName(event_name), m_FunctionID(-1), m_NameMatched()
{
}

//// <!> GOVNOCODE <!> ////
#define CASE(n) case n: fid = MF_RegisterSPForwardByName(amx, fname
#define AT(n) ,proto_args[n]
#define DONE ,FP_DONE); break;
int RegisterSPForwardByProto(AMX *amx, const char *fname, const int *proto_args)
{
	int num_args = 0;
	while(proto_args[num_args] != FP_DONE && num_args < 100)
		num_args++;

	assert(num_args < 15);

	int fid;
	switch(num_args)
	{
		CASE( 0) DONE;
		CASE( 1) AT(1) DONE;
		CASE( 2) AT(1) AT(2) DONE;
		CASE( 3) AT(1) AT(2) AT(3) DONE;
		CASE( 4) AT(1) AT(2) AT(3) AT(4) DONE;
		CASE( 5) AT(1) AT(2) AT(3) AT(4) AT(5) DONE;
		CASE( 6) AT(1) AT(2) AT(3) AT(4) AT(5) AT(6) DONE;
		CASE( 7) AT(1) AT(2) AT(3) AT(4) AT(5) AT(6) AT(7) DONE;
		CASE( 8) AT(1) AT(2) AT(3) AT(4) AT(5) AT(6) AT(7) AT(8) DONE;
		CASE( 9) AT(1) AT(2) AT(3) AT(4) AT(5) AT(6) AT(7) AT(8) AT(9) DONE;
		CASE(10) AT(1) AT(2) AT(3) AT(4) AT(5) AT(6) AT(7) AT(8) AT(9) AT(10) DONE;
		CASE(11) AT(1) AT(2) AT(3) AT(4) AT(5) AT(6) AT(7) AT(8) AT(9) AT(10) AT(11) DONE;
		CASE(12) AT(1) AT(2) AT(3) AT(4) AT(5) AT(6) AT(7) AT(8) AT(9) AT(10) AT(11) AT(12) DONE;
		CASE(13) AT(1) AT(2) AT(3) AT(4) AT(5) AT(6) AT(7) AT(8) AT(9) AT(10) AT(11) AT(12) AT(13) DONE;
		CASE(14) AT(1) AT(2) AT(3) AT(4) AT(5) AT(6) AT(7) AT(8) AT(9) AT(10) AT(11) AT(12) AT(13) AT(14) DONE;
		CASE(15) AT(1) AT(2) AT(3) AT(4) AT(5) AT(6) AT(7) AT(8) AT(9) AT(10) AT(11) AT(12) AT(13) AT(14) AT(15) DONE;
	}

	return (fid > 0) ? fid : 0;
}

void t_SubscribeEvent_Helper::Examine(const char *pending_event_name, const int *pending_proto_args, int &pending_callback)
{
	if(m_NameMatched || strcmp(pending_event_name, m_EventName))
		return;
	m_NameMatched = true;

	int fid = RegisterSPForwardByProto(m_AMX, pending_event_name, pending_proto_args);
	if(fid)
		pending_callback = fid;
}